package leedcode_path.回溯;

import java.util.*;

public class 组合总和3 {
    /*
    * 给定一个候选人编号的集合 candidates 和一个目标数 target ，找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意：解集不能包含重复的组合。
* 输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]*/

    List<Integer> path = new ArrayList<Integer>();
    List<List<Integer>> res=new ArrayList<List<Integer>>();
    int sum=0;

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        for (int i = 0; i < candidates.length-1; i++) {
            for (int j = 0; j < candidates.length-1-i; j++) {
                if (candidates[j]>candidates[j+1]){
                    int t=candidates[j];
                    candidates[j]=candidates[j+1];
                    candidates[j+1]=t;
                }
            }
        }
        boolean[] used=new boolean[candidates.length];
        Arrays.fill(used,false);
        backtracking(candidates,target,0,used);
        return res;
    }
    public void backtracking(int[] candidates, int target,int startindex,boolean[] used){
        if (sum>target) return;
        if (sum==target) {
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = startindex; i <candidates.length ; i++) {
            if (i>0&&candidates[i]==candidates[i-1]&&used[i-1]==false){
                continue;
            }
            sum+=candidates[i];
            path.add(candidates[i]);
            used[i]=true;
            backtracking(candidates,target,i+1,used);
            used[i]=false;
            sum-=candidates[i];
            path.remove(path.size()-1);
        }

    }

}
